#include "./ThirdLib/main.h"
#include "./ThirdLib/stm32f4xx_hal.h"
#include "./ThirdLib/gpio.h"
#include "./ThirdLib/tim.h"
#include "./ThirdLib/usart.h"
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define RX_BUF_LEN 64
uint8_t rx_buf[RX_BUF_LEN];// 临时存一条串口命令
uint8_t rx_data;// 单字节接收缓冲
uint16_t rx_index = 0;// 当前接收位置

// 串口中断回调函数
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
    if(huart->Instance == USART2)
    {
        if(rx_index < RX_BUF_LEN - 1)
        {
            rx_buf[rx_index++] = rx_data;
            if(rx_data == '\n')
            {
                rx_buf[rx_index] = 0; // 结尾补0
                parse_command((char*)rx_buf);
                rx_index = 0;
            }
        }
        else
        {
            rx_index = 0; // 防止溢出
        }
        HAL_UART_Receive_IT(&huart2, &rx_data, 1); // 继续接收
    }
}

// 指令解析函数
void parse_command(char* cmd)
{
    int lw = 0, rw = 0;
    // 支持格式 L:100 R:200\n
    if(sscanf(cmd, "L:%d R:%d", &lw, &rw) == 2)
    {
        set_left_wheel_speed((int16_t)lw);
        set_right_wheel_speed((int16_t)rw);
    }
}

// 控制左轮电机的PWM输出
void set_left_wheel_speed(int16_t speed)
{
    __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, speed);
}

// 控制右轮电机的PWM输出
void set_right_wheel_speed(int16_t speed)
{
    __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_2, speed);
}

int main(void)
{
    HAL_Init();
    SystemClock_Config();
    MX_GPIO_Init();
    MX_USART2_UART_Init();

    /* 启动串口中断接收 */
    HAL_UART_Receive_IT(&huart2, &rx_data, 1);

    while (1)
    {
        // 所有控制都在中断回调里，这里可以什么都不写
        // 也可以添加你自己的其他任务
        HAL_Delay(10); // 简单让出CPU
    }
}


